package com.example.common.web.exception;

import com.example.common.web.response.Result;
import com.example.common.web.response.ResultCode;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @Auther: hjy(lc))
 * @Date: 2022/10/31-10-31-15:03
 * @Description：com.example.common.web.exception   全局异常处理
 */

@RestControllerAdvice       //@RestController + @Advice
public class GlobalExceptionHandler {
    /**
     * 所有的异常都会被捕获 返回统一的格式
     * @param ex    所有异常的父类（多态接受可能抛出的异常）
     * @return    统一响应
     */
    @ExceptionHandler(Exception.class)
    public Result handler(Exception ex){
        System.out.println("GlobalExceptionHandler.handler");
        ex.printStackTrace();
        //第三方类的异常
        //自定义的异常
        if(ex instanceof CustomerException){
            CustomerException ce = (CustomerException) ex;
//            return Result.failure(ex.getMessage());
            return Result.failure(ce.getResultCode());
        }else if(ex instanceof MethodArgumentNotValidException){
            MethodArgumentNotValidException me = (MethodArgumentNotValidException) ex;
            BindingResult bindingResult = me.getBindingResult();
            if(bindingResult.hasErrors()){
                String defaultMessage = bindingResult.getFieldErrors().get(0).getDefaultMessage();
                return Result.failure(defaultMessage);
            }
        }
        return Result.failure(ResultCode.SYSTEM_INNER_ERROR);
    }
}
